package com.info.zhiduoduo.common.annotation;

import com.baomidou.mybatisplus.activerecord.Model;
import com.info.zhiduoduo.common.exception.ZddLogFieldNotFoundException;
import com.info.zhiduoduo.common.exception.ZddLogParamenterNotFoundException;

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.Target;

import static java.lang.annotation.RetentionPolicy.RUNTIME;

/**
 * 标记 系统中要记录操作日志的具体数据库的entity类型，比如更新创客、企业、合伙人等entity
 * <p> 配合{@link LogEntity}注解使用。
 *
 * @see ZddLog
 */
@Target({ElementType.PARAMETER})
@Retention(RUNTIME)
@Documented
public @interface DependOnEntity {

	/**
	 * 要依赖的的Entity class类型，比如创客-Maker.class, 创客账户-MakerAccount.class，企业-Company.class etc.
	 * <p> </p>
	 * <p> 在本项目中必须是MyBatis-plus Entity类型，方便直接new XXXX().selectById()等操作获取entity对象
	 */
	Class<? extends Model<?>> entity();

	/**
	 * 指定{@link LogEntity} Model entity表结构中的column名。如果不设置，则使用Entity class定义的主键{@code @TableId}。
	 * <p> </p>
	 * 支持多个字段名称，表示要通过多个字段去查询一个entity对象。
	 * <p> </p>
	 * 这里设置的fields数量需要与{@link DependOnEntity#parameters()} 一致。
	 * <p> </p>
	 * 如果设置的字段在{@link DependOnEntity#entity()} Class中没有找到，在接口执行时会抛出异常{@link ZddLogFieldNotFoundException}。
	 * <p> </p>
	 * 例如：我们要通过userid查询Maker数据，则这里可以配置成 "userid"，实际会用如下代码去查询：
	 * <pre>
	 *    Maker maker = new Maker().selectOne(Condition.create().eq("userid", parameter));
	 *
	 *    代码中的parameter就是根据{@link DependOnEntity#parameters()}中配置的参数去查找到的具体请求参数的userid的值。
	 * </pre>
	 *
	 * @see ZddLogFieldNotFoundException
	 */
	String[] fields() default {};

	/**
	 * 指定{@link DependOnEntity#entity()}对象中的什么字段，是用来当作参数值去查询{@link LogEntity}对象。
	 * <p> </p>
	 * <p> 如果设置的字段在请求参数对象或dependOnEntity Class中没有找到，在接口执行时会抛出异常{@link ZddLogParamenterNotFoundException}。
	 * <p> </p>
	 * <p> 这里设置的parameters数量需要与{@link DependOnEntity#fields()} 一致。
	 *
	 * @see ZddLogParamenterNotFoundException
	 */
	String[] parameters() default {};

}
